package com.centriole.service.workflow.controller.ex;

import com.centriole.common.utils.CommonUtil;
import com.centriole.service.workflow.common.QueryVo;
import com.centriole.service.workflow.entity.ProInstance;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;

public class ExUtils {

    private ExUtils(){
        throw new RuntimeException("不需要实例化com.centriole.service.workflow.controller.ex.ExUtils");
    }

    public static void checkQueryVo(QueryVo vo){
        if( StringUtils.isBlank( vo.getUserId() ))          throw new RuntimeException("userId不能为空！");
        // ...
    }

    /**
     * 根据QueryVo判断 该数据是否应该被过滤掉
     * @return  返回false表示该数据舍弃
     */
    public static boolean isFiltered(QueryVo vo , ProInstance p){
            //【1】ProInstance 为空 ，过滤掉
            if(p == null) return false;

            //【2】应用名 'appName'
            if( StringUtils.isNoneBlank(vo.getAppName()) && !vo.getAppName().equalsIgnoreCase(p.getAppName()) ) return false;
            //【3】长期未结束 'deadTime'
                        //如果设置了超期时间，但流程实例已经结束了，过滤掉
            if( vo.getDeadTime()!=null  && p.getFinishTime() !=null  )return false;
                        //如果 结束时间 没有超过 超期时间 ， 则过滤掉
            int timeOutTime = CommonUtil.intervalDay(new Date(), p.getCreateDate(), TimeUnit.DAYS);
            if( vo.getDeadTime()!=null  &&  vo.getDeadTime()  > timeOutTime ) {
                return false;
            }else{
                        //如果确实超时了，那么将超时时间set到ProInstace中
                p.setTimeOutTime(timeOutTime);
            }
            //【4】开始时间 'startTime'  和 结束时间 'finishTime'
            if( vo.getStartTime() !=null || vo.getFinishTime()!=null ){
                if( vo.getStartTime()!=null && p.getCreateDate().getTime()- vo.getStartTime().getTime() < 0 )  return false;
                if( vo.getFinishTime()!=null && p.finishTime!=null && p.finishTime.getTime() - vo.getFinishTime().getTime() > 0 ) return false;
                if(p.finishTime == null) return false;
            }
            //【5】流程发起人 'applyUser'
            if( StringUtils.isNotBlank(vo.getApplyUser()) && !p.getApplyUser().contains(vo.getApplyUser())) return false;
                        /*
                    }catch (NullPointerException e){
                        e.printStackTrace();
                        System.err.println("有一个SB流程实例： " + p.getInstanceId());
                    }
                    */
        return true;
    }

    /**
     * 如果一个 字符串key属于blank , 那么给个默认的key，比如"others"
     * @param key
     * @return
     */
    public static  String ifBlankThenDefaultKey(String key){
        return StringUtils.isBlank( key )?"others":key;
    }


}
